package br.com.financas.daos;

import br.com.financas.beans.Categoria;
import br.com.financas.beans.Conta;
import br.com.financas.beans.Movimentacao;
import br.com.financas.beans.Pessoa;
import br.com.financas.beans.TipoMovimentacao;
import br.com.financas.util.HibernateUtil;
import java.math.BigDecimal;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Denis
 */
public class MovimentacaoDao {
   
    Session sessao;
    Transaction trans;
    List<Movimentacao> list;
    
    public void addMovimentacao(Movimentacao m,Conta c,TipoMovimentacao t, Pessoa p,Categoria g){
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            trans=sessao.beginTransaction();

            Movimentacao movimentacao = new Movimentacao();
            TipoMovimentacao tipoMovimentacao = new TipoMovimentacao();
            Categoria categoria = new Categoria();
            Conta conta = new Conta();
            Pessoa pessoa = new Pessoa();

            conta.setIdConta(c.getIdConta());
            categoria.setIdCategoria(g.getIdCategoria());
            tipoMovimentacao.setIdTipoMovimentacao(t.getIdTipoMovimentacao());
            pessoa.setIdPessoa(p.getIdPessoa());
       
            movimentacao.setDescricao(m.getDescricao());
            movimentacao.setDataM(m.getDataM());
            movimentacao.setValor(m.getValor());
            movimentacao.setIdConta(conta);
            movimentacao.setIdPessoa(pessoa);
            movimentacao.setIdTipoMovimentacao(tipoMovimentacao);
            movimentacao.setIdCategoria(categoria);

            sessao.save(movimentacao);
            trans.commit();
            
        } catch (Exception e){
             e.printStackTrace();
        }finally{
             sessao.close();
        }
    }
    
    public void updateMovimentacao(Movimentacao m, Conta c,Categoria g,TipoMovimentacao t){
       try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            trans=sessao.beginTransaction();
            
            m.setIdConta(c);
            m.setIdCategoria(g);
            m.setIdTipoMovimentacao(t);
            
            sessao.update(m);
            trans.commit();
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            sessao.close();
        }
    }
    
    public void deletarMovimentacao(Movimentacao m){
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            trans=sessao.beginTransaction();
            sessao.delete(m);
            trans.commit();
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            sessao.close();
        }
    }
     public List<Movimentacao> listar(Pessoa pessoa){
        sessao = HibernateUtil.getSessionFactory().openSession();
        trans=sessao.beginTransaction();
        Criteria cri = sessao.createCriteria(Movimentacao.class);
        cri.createCriteria("idPessoa").add(Restrictions.eq("id",pessoa.getIdPessoa()));
        this.list = cri.list();
        sessao.close();
        return list;
    }
     public List<Movimentacao> listarRelatorio(Pessoa pessoa,Conta conta,Categoria categoria){
        sessao = HibernateUtil.getSessionFactory().openSession();
        trans=sessao.beginTransaction();
        Criteria cri = sessao.createCriteria(Movimentacao.class);
        cri.createCriteria("idPessoa").add(Restrictions.eq("id",pessoa.getIdPessoa()));
        this.list = cri.list();
        sessao.close();
        return list;
    }
}
